package com.example.demo.controller

import jakarta.servlet.http.HttpServletResponse
import org.springframework.http.ResponseEntity
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.reactive.function.client.WebClient
import org.springframework.web.servlet.ModelAndView
import org.springframework.web.servlet.view.RedirectView
import reactor.core.publisher.Mono

@Controller
@RequestMapping("/api")
class RedirectController {
    val redirectUrl: String = "https://www.baidu.com"

    @GetMapping("/redirect1")
    fun redirect1(): RedirectView {
        // RedirectView 是 SpringMVC 提供的一个视图类，用于执行重定向操作
        return RedirectView(redirectUrl)
    }

    @RequestMapping("/redirect2")
    fun redirect2(): String {
        // 在 SpringMVC 中，返回一个以 redirect: 开头的字符串可以实现重定向
        return "redirect:$redirectUrl"
    }

    @GetMapping("/redirect3")
    fun redirect3(response: HttpServletResponse) {
        // 通过操作 HttpServletResponse 对象，可以手动设置响应头实现重定向
        response.sendRedirect(redirectUrl)
    }

    @GetMapping("/redirect4")
    fun redirect4(): ResponseEntity<String> {
        // ResponseEntity 提供了一种灵活的方式来构建 HTTP 响应，包括状态码和响应头
        return ResponseEntity.status(302)
            .header("Location", redirectUrl)
            .build()
    }

    @GetMapping("/redirect5")
    fun redirect5(): Mono<String> {
        // 如果你需要在后端进行异步请求并重定向，可以使用 WebClient 或 RestTemplate
        return WebClient.create(redirectUrl)
            .get()
            .retrieve()
            .bodyToMono(String::class.java)
            .map { "redirect:$redirectUrl" }
    }

    @GetMapping("/redirect6")
    fun redirect6(): ModelAndView {
        // ModelAndView 可以同时设置模型数据和视图，也可以用于重定向
        return ModelAndView("redirect:$redirectUrl")
    }
}